D - Polyomino - AtCoder Beginner Contests 322
Difficulty: 1310 水色diff
問題: https://atcoder.jp/contests/abc322/tasks/abc322_d
提出: https://atcoder.jp/contests/abc322/submissions/46166606
方針
全探索
全ての置き方を探索する
置き方16通り, 回転の仕方4通り、与えられるポリオミノ3つ
全探索しても間に合う
ただし、そのまま愚直に実装しようとするとしんどい
8重以上のループに悩まされる
いちいちマス目とブロックの噛み合わせを線形探索する必要があって面倒くさい
戦略
バグを排除しやすい書き方を取る。
あるマス目の重複可能性のある配置にはstd::vectorよりもstd::setで座標を管理すると素早くread, writeができる。
ブロックの移動領域を整理するために、あらかじめ"正規化"しておく。
再帰を使ってn重ループに対処する
単体テストを挟み、具体例による検証を行う
今回組むプログラムは複雑なため、各部分で動作が保証されていることが望ましい。
所感
やっぱり競技プログラミングでも、バグをとることにおいては単体テストは大事だなと思うなどした
時間はかかるけど、バグを多めに引き起こす自分としては泥沼にハマらないためにはやったほうがいいなあ
AtCoder_Beginner_Contest 322 D Polyomino